/*
	编解码RPC请求数据，工具包
*/

package codec

import "io"

type Header struct {
	ServiceMethod string // 请求方法“Service.Method”
	Seq           string // 请求ID，区分不同的请求
	Error         string // 错误信息；客户端置为空；服务端出错时写入
}

// 抽象出codec接口，用于实现不同的codec实例
type Codec interface {
	io.Closer

	// 读取消息头
	ReadHead(*Header) error

	// 读取消息体
	ReadBody(interface{}) error

	// 写入消息
	Write(*Header, interface{}) error
}

/*
	抽象出Codec的构造函数
*/

type NewCodecFunc func(io.ReadWriteCloser) Codec

type Type string

const (
	GobType  = "application/gob"
	JsonType = "application/json"
)

// 存储Type与之对应的CodecFunc
var NewCodecFuncMap map[Type]NewCodecFunc

func init() {
	NewCodecFuncMap = make(map[Type]NewCodecFunc)
	NewCodecFuncMap[GobType] = NewGobCodec
}
